داده‌هایمان را بشناسیم

این داده شامل اطلاعات اقامت و رزرو مهمان‌های هتل مجید است. جزئیات این اطلاعات شامل تاریخ رزرو، تاریخ ورود و خروج، طول اقامت، هزینه‌ی اتاق، نوع اتاق و حتی کشور مبدا مسافران است! چند رکورد از این داده را میبینیم: همانطور که در جدول مشخص است مورد دوم رزرو خود را کنسل کرده پس روز ورود و خروج و… برای این مورد ثبت نشده.

gt::gt(head(hotel_data))
index check_in_date check_out_date booking_date Country room_type_code Status stay_duration price_pernight
1 2013-07-24 2013-07-25 2013-06-06T14:24:10Z Netherlands D1 Checked Out 1 30.00
2 2013-06-07T00:09:08Z Denmark D1 Cancelled 0 28.99
3 2013-08-01 2013-08-03 2013-06-07T00:09:20Z Switzerland D2 Checked Out 2 25.38
4 2013-08-01 2013-08-03 2013-06-07T00:09:20Z Switzerland D2 Checked Out 2 29.60
5 2013-07-26 2013-07-27 2013-06-07T00:09:42Z D3 Checked Out 1 29.90
6 2013-07-26 2013-07-28 2013-06-07T00:11:38Z Netherlands C3 Checked Out 2 24.19

اشتباهات داده را پیدا کنیم

لیست زیر اقداماتی است که برای آشکار شدن! داده‌های غلط انجام شد ۱- مقدار status و stay duration برای رزروهایی که کنسل شده یا نشده اند همخوانی داشته باشد ۲- فاصله‌ی تاریخ ورود و خروج برابر مدت اقامت باشد ۳- قیمت اتاق های مختلف داده‌ی پرت نداشته باشد ۴- تاریخ رزرو قبل از تاریخ ورود باشد

library(data.table)
hotel_data=data.table(hotel_data)

# no faulty data in stay duration
calculated_duration=hotel_data[str_c(ymd(check_out_date) - ymd(check_in_date))!=stay_duration]

# no faulty data in status/stay duration
cancelled_but_checked_out=
  hotel_data[stay_duration==0 & Status=="Checked Out"]
  
#room type categorized to determine outlier
cat_hotel=hotel_data[ , room_cat :=str_extract(room_type_code,"[A-Z]")]
                      
ggplot(cat_hotel,aes(x=month(ymd_hms(booking_date)),y=price_pernight,color=room_cat))+
  geom_point(size=2)+
  facet_wrap(~room_cat)

باور این که اتاق Bدر تمام طول این ۲ سال خالی بوده است دشوار است! پس یا این داده اشتباه وارد شده و هتل اصلا اتاق به این نوع ندارد یا اتاق بسیار بدیست!

checkin_before_booking=
  hotel_data[ymd(floor_date(ymd_hms(hotel_data$booking_date),unit = "days"))> ymd(check_in_date)]

# remove faulty data
hotel_data=hotel_data[ymd(floor_date(ymd_hms(hotel_data$booking_date),unit = "days"))< ymd(check_in_date)+days(1)]

gt::gt(head(checkin_before_booking))
index check_in_date check_out_date booking_date Country room_type_code Status stay_duration price_pernight room_cat
72 2013-07-02 2013-07-03 2013-07-03T01:01:44Z D2 Checked Out 1 26.07 D
155 2013-07-05 2013-07-06 2013-07-06T01:04:13Z D1 Checked Out 1 29.00 D
156 2013-07-05 2013-07-06 2013-07-06T01:04:15Z D1 Checked Out 1 29.00 D
157 2013-07-05 2013-07-06 2013-07-06T01:04:17Z D1 Checked Out 1 29.00 D
264 2013-07-09 2013-07-10 2013-07-10T01:48:50Z France D2 Checked Out 1 26.07 D
274 2013-07-09 2013-07-10 2013-07-10T07:22:29Z Germany D1 Checked Out 1 29.00 D

این جدول چند نمونه از مشتریان را نشان میدهد که بعد از وارد شدن و اتاق گرفتن، رزرو کردند! بسته به سیاست‌های هتل این داده ها می‌توانند غلط باشند

داده‌هایمان را تحلیل کنیم

مشتریان هتل بیشتر از کدام کشورها هستند؟

guests_origin=hotel_data[, .N, by=Country]

plot_ly(head(guests_origin[Country!=""],20), labels = ~Country, values = ~N, type = 'pie',
      textposition = 'inside',
      textinfo = 'label+percent',
      insidetextfont = list(color = '#FFFFFF'),
      hoverinfo = 'text',
      text = ~paste(N, ' guests'),
      marker = list(colors = colors,
                    line = list(color = '#FFFFFF', width = 1)),
      showlegend = FALSE)

پراکندگی مهمان‌ها در یک نقشه‌ی جهان را نیز ببینیم

library(rgdal)
library(leaflet)
library(RColorBrewer)

world_spdf <- readOGR(
  dsn= paste0(getwd(),"/world_shape_file/") ,
  layer="TM_WORLD_BORDERS_SIMPL-0.3",
  verbose=FALSE
)

# Clean the data object
world_spdf@data$POP2005[ which(world_spdf@data$POP2005 == 0)] = NA
world_spdf@data$POP2005 <-round(as.numeric(as.character(world_spdf@data$POP2005)) / 1000000,2)
world_spdf@data=guests_origin[world_spdf@data,on=c("Country"="NAME")]
# make pallete
mybins <- c(0,10,20,50,100,500,Inf)
mypalette <- colorBin( palette="YlOrBr", domain=world_spdf@data$n, na.color="transparent", bins=mybins)
 
# Prepare the text for tooltips:
mytext <- paste(
    "Country: ", world_spdf@data$Country,"<br/>", 
    "Guests: ", world_spdf@data$N, "<br/>", 
    "Population: ", round(world_spdf@data$POP2005, 2), 
    sep="") %>%
  lapply(htmltools::HTML)
 
# Final Map
leaflet(world_spdf) %>% 
  addTiles()  %>% 
  setView( lat=10, lng=0 , zoom=2) %>%
  addPolygons( 
    fillColor = ~mypalette(N), 
    stroke=TRUE,
    fillOpacity = 0.9, 
    color="white", 
    weight=0.3,
    label = mytext,
    labelOptions = labelOptions( 
      style = list("font-weight" = "normal", padding = "3px 8px"), 
      textsize = "13px", 
      direction = "auto"
    )
  ) %>%
  addLegend( pal=mypalette, values=~N, opacity=0.9, title = "Population (M)", position = "bottomleft" )

هتل در چه زمانی از سال بیشتر مشتری دارد؟

نرخ رزرو و ورود مهمان‌ها را در طول سال میبینیم. به نظر می‌رسد که این هتل در ماه‌های پاییزی مشتریان بیشتری دارد

hotel_data=data.table(hotel_data)
booking_season=hotel_data[, .N ,by=month(ymd_hms(booking_date))]
booking_season[, Type:="Booking"]

check_in_data=hotel_data[check_in_date!=""]
check_in_season=check_in_data[, .N ,by=month(ymd(check_in_date))]
check_in_season[, Type:="Check in"]

ggplot(rbind(booking_season,check_in_season),aes(month,N,fill=Type))+geom_col()+
  labs(title = "Booking and checking in rate whitin a year",y="number of customers")

هتل در چه فصل‌هایی از سال بیشترین مشتری را دارد؟

hotel_data=data.table(hotel_data)
hotel_data[month(ymd(check_in_date)) %in% c(6,7,8), Season := "Summer"]
hotel_data[month(ymd(check_in_date)) %in% c(12,1,2), Season := "Winter"]
hotel_data[month(ymd(check_in_date)) %in% c(3,4,5), Season := "Spring"]
hotel_data[is.na(Season), Season := "Autumn"]
guest_per_season=hotel_data[, .N, by=Season]

plot_ly(na.omit(guest_per_season), labels = ~Season, values = ~N, type = 'pie',
      textposition = 'inside',
      textinfo = 'label+percent',
      insidetextfont = list(color = '#FFFFFF'),
      hoverinfo = 'text',
      text = ~paste(N, ' guests'),
      marker = list(colors = c("#6db356","orange","steelblue","pink"),
                    line = list(color = '#FFFFFF', width = 1)),
      showlegend = FALSE)

در چه ماه از سال احتمال آنکه مشتریان رزرو خود را کنسل کنند بیشتر است؟

hotel_data=read.csv("~/Downloads/data.csv")
hotel_data=data.table(hotel_data)
cancelled=hotel_data[Status=="Cancelled"]

cancelled[month(ymd_hms(booking_date)) %in% c(6,7,8), Season := "Summer"]
cancelled[month(ymd_hms(booking_date)) %in% c(12,1,2), Season := "Winter"]
cancelled[month(ymd_hms(booking_date)) %in% c(3,4,5), Season := "Spring"]
cancelled[is.na(Season), Season := "Autumn"]
cancelled_season=cancelled[, .N, by=Season]

plot_ly(na.omit(cancelled_season), labels = ~Season, values = ~N, type = 'pie',
      textposition = 'inside',
      textinfo = 'label+percent',
      insidetextfont = list(color = '#FFFFFF'),
      hoverinfo = 'text',
      text = ~paste(N, ' guests'),
      marker = list(colors = c("#6db356","orange","steelblue","pink"),
                    line = list(color = '#FFFFFF', width = 1)),
      showlegend = FALSE)

میانگین قیمت اتاق‌ها در طول سال چه تغییری می‌کند؟

price_per_month=hotel_data[, .(room_price_mean=mean(price_pernight)), by=month(ymd(check_in_date))]
guests_per_month=hotel_data[, .N , by=month(ymd(check_in_date))]
price_per_month=na.omit(price_per_month)
guests_per_month=na.omit(guests_per_month)
price_demand=guests_per_month[price_per_month,on=c("month","month")]

ggplot(price_demand,aes(x=month))+
  geom_line(aes(y=N/max(N),color="average price per night"))+
  geom_line(aes(y=room_price_mean/max(room_price_mean),color="customers rate"))

چه اتاق‌هایی گران‌ترند؟

guest_per_room=hotel_data[, .N , by= room_type_code]
ggplot(guest_per_room,aes(x=room_type_code,y=N))+geom_col(fill="steelblue")

چه اتاق‌هایی پرطرفدارترند؟

avg_price_per_room=hotel_data[, .(avg_price=mean(price_pernight)) , by= room_type_code]
ggplot(avg_price_per_room,aes(x=room_type_code,y=avg_price))+geom_col(fill="pink")

تحلیل قیمت هر اتاق برای هر شب

ppn_summarise=cat_hotel[, keyby = .(room_cat),
     .(avg = mean(price_pernight),std=sd(price_pernight))]
gt::gt(ppn_summarise)
room_cat avg std
A 44.46390 11.112842
B 39.99000 NA
C 27.40846 2.867252
D 25.73160 1.645656

انتخاب ویژگی

در این قسمت می‌خواهیم به پارامتر‌های موثر در داده اشاره کنیم. اگر به نمودارهایی که کشیدیم توجه کنیم، میبینیم که محور اصلی بسیاری از این نمودارها به نوع اتاق وابسته بود. در داشبورد نیز می‌توانیم ببینیم که تقریبا قیمت هر اتاق cوd ثابت است ولی قیمت اتاق‌های Aمتغیر است.

به نمودار‌های میانگین قیمت هر اتاق و نمودار عرضه و تقاضا نیز می‌توان اشاره کرد که هم اهمیت پارامتر نوع اتاق و هم اهمیت پارامتر هزینه‌ی اتاق را مشخص می‌کند

در بین پارامتر‌هایی که تاریخی را مشخص می‌کنند به نظر زمان ورود از اهمیت بیشتری برخوردار است چون وضعیت هتل و تقاضا را نشان می‌دهد همچنین توزیع تقاضا در ماه‌ها یا فصل‌های سال را با همین پارامتر می‌سنجیم

پارامتری که کشور مبدا را مشخص می‌کند می‌تواند برای تعیین جامعه‌ی هدف تبلیغات می‌تواند موثر باشد. وضعیت کنسلی نیز